﻿using ExcellentProjectPlus.Dominio.Catalogos.Entidades;
using ExcellentProjectPlus.Dominio.Catalogos.Servicios.Catalogos;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace ExcellentProjectPlus.Aplicacion.Catalogos.Catalogos
{
    public class ServicioDeGestionDeCatalogos
        : IServicioDeGestionDeCatalogos
    {
        #region Propiedades
        IServicioDeAdministracionDeCatalogos _servicioDeAdministracionDeCatalogos;
        #endregion

        #region Constructores
        public ServicioDeGestionDeCatalogos(IServicioDeAdministracionDeCatalogos servicioDeAdministracionDeCatalogos)
        {
            _servicioDeAdministracionDeCatalogos = servicioDeAdministracionDeCatalogos;
        }
        #endregion
        public IEnumerable<Catalogo> ObtenerCatalogos()
        {
            IEnumerable<Catalogo> resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCatalogos.ObtenerCatalogos();
                transaccion.Complete();
            }

            return resultado;
        }

        public Catalogo ObtenerCatalogoPorId(int id)
        {
            Catalogo resultado = null;
            var trxOptions = new TransactionOptions();
            //Lectura con nivel de aislamiento ReadUncommited para evitar bloqueos en la base
            trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
            trxOptions.Timeout = TimeSpan.FromMinutes(2);
            using (var transaccion = new TransactionScope(TransactionScopeOption.RequiresNew, trxOptions))
            {
                resultado = _servicioDeAdministracionDeCatalogos.ObtenerCatalogoPorId(id);
                transaccion.Complete();
            }

            return resultado;
        }

        public void AgregarCatalogo(Catalogo catalogo)
        {
            _servicioDeAdministracionDeCatalogos.AgregarCatalogo(catalogo);
        }

        public void ModificarCatalogo(Catalogo catalogo)
        {
            _servicioDeAdministracionDeCatalogos.ModificarCatalogo(catalogo);
        }

        public void EliminarCatalogo(Catalogo catalogo)
        {
            _servicioDeAdministracionDeCatalogos.EliminarCatalogo(catalogo);
        }

        public IEnumerable<Catalogo> ObtenerCatalogosPaginado(int pagina, int tamanio)
        {
            return _servicioDeAdministracionDeCatalogos.ObtenerCatalogosPaginado(pagina, tamanio);
        }
        public void Dispose()
        {
            throw new NotImplementedException();
        }



    }
}

